/**********************************************************************************\
** 文件名称: buf.c
** 创建人员: YCG
** 创建日期: 2018-11-03
** 文档描述:
** 版本代号: V0.1
** 版本说明: 初始版本
\********************************************************************************/
#include "buf.h"

/*******************************************************************************
** 函数名称: BufInit
** 功能描述: 初始化一个缓存
** 参数说明: bufst: [输入]  缓存结构体变量，存放相关的数据
**			     badd:  [输入]  缓存的地址
**			     len:   [输入]  缓存的长度
** 返回说明: SUCCESS：成功 FAILD：失败
** 创建人员: YCG
** 创建日期: 2018-11-03
********************************************************************************/
void BufInit(buf_struct* bufst, uint8_t* badd, uint16_t len) {
    bufst->buf =      badd;
    bufst->cnt =      0;
    bufst->ReadPot =  0;
    bufst->writePot	= 0;
    bufst->lengh =    len;
}

/*******************************************************************************
** 函数名称: BufWrite
** 功能描述: 往缓存中写入一个数据
** 参数说明: bufst: [输入] 操作的缓存结构体变量
**			     dat:   [输入] 需要写入的数据
** 返回说明: SUCCESS：成功 ERROR：失败
** 创建人员: YCG
** 创建日期: 2018-11-03
********************************************************************************/
uint8_t BufWrite(buf_struct* bufst, uint8_t dat) {
    ErrorStatus status = ERROR;                //返回状态标志
    if(bufst->cnt < bufst->lengh) {            //判断发送缓存中是否有空间
        bufst->buf[bufst->writePot] = dat;     //将数据写入缓存
        bufst->cnt++;                          //缓存计数加一
        bufst->writePot++;                     //写入位置加一
        if(bufst->writePot >= bufst->lengh) {  //写入位置大于缓存长度
            bufst->writePot = 0;               //回到起点，形成环形缓冲
        }
        status = SUCCESS;                      //返回写入成功
    } else {
        status = ERROR;                        //返回写入失败
    }
    return (status);
}

/*******************************************************************************
** 函数名称: BufWrite
** 功能描述: 从缓存中读取一个数据
** 参数说明: bufst: [输入] 操作的缓存结构体变量
**			     dat:   [输入] 存放读取的数据
** 返回说明: SUCCESS：成功 FAILD：失败
** 创建人员: YCG
** 创建日期: 2018-11-03
********************************************************************************/
uint8_t BufRead(buf_struct* bufst) {
    uint8_t dat;
    if(bufst->cnt > 0) {                       //判断发送缓存中是否有数据
        dat = bufst->buf[bufst->ReadPot];     //读取缓存中的一个数据
        bufst->cnt--;                          //缓存计数减一
        bufst->ReadPot++;                      //读取位置加一
        if(bufst->ReadPot >= bufst->lengh) {   //读取位置大于缓存长度
            bufst->ReadPot = 0;                  //回到起点，形成环形缓冲t 
        }
		   return dat ;
    }
        return 0 ;   
}

/*******************************************************************************
** 函数名称: BufSpace
** 功能描述: 获取缓存的剩余空间
** 参数说明: bufst: [输入] 操作的缓存结构体变量
** 返回说明: 剩余缓存的数量
** 创建人员: YCG
** 创建日期: 2018-11-03
********************************************************************************/
uint8_t BufUnuseSpace(buf_struct* bufst) {
    return   (bufst->lengh - bufst->cnt);
}
/*******************************************************************************
** 函数名称: BufCnt
** 功能描述: 获取数据的数量
** 参数说明: bufst: [输入] 操作的缓存结构体变量
** 返回说明: 数据的数量
** 创建人员: YCG
** 创建日期: 2018-11-03
********************************************************************************/
uint8_t BufUseSpace(buf_struct *bufst) {
    return   (bufst->cnt);
}
/********************************End of File************************************/
